package com.unitd.modules.sso.controller;

import com.unitd.comm.web.BaseController;
import com.unitd.frame.sso.annotation.Action;
import com.unitd.frame.sso.annotation.Login;
import com.unitd.frame.sso.common.config.SSOConfig;
import com.unitd.frame.sso.common.config.SSOProperties;
import com.unitd.frame.sso.common.helper.AjaxHelper;
import com.unitd.frame.sso.common.helper.SSOHelper;
import com.unitd.frame.sso.common.token.AuthToken;
import com.unitd.frame.sso.common.token.Token;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;

/**
 * @desc SSO服务端响应登录请求客户端, 应答客户端是否登录成功
 * @filename ReplyLoginController.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2016/10/24
 */
@Controller
public class ReplyLoginController extends BaseController {

	/**
	 * @desc 回复子系统是否登录
	 */
	@Login(action = Action.Skip)
	@RequestMapping("/replylogin")
	@ResponseBody
	public void replylogin() {
		StringBuilder replyData = new StringBuilder();
		replyData.append(request.getParameter("callback")).append("({\"msg\":\"");
		Token token = SSOHelper.getToken(request);
		if (token != null) {
			String askData = request.getParameter("askData");
			if (askData != null && !"".equals(askData)) {

				SSOProperties prop = SSOConfig.getSSOProperties();

				/* 下面开始验证票据，签名新的票据每一步都必须有 */
				// 根据请求的询问密文生成对应的跨域回复密文
				AuthToken at = SSOHelper.replyCiphertext(request, askData);
				if (at != null) {

					// 1、业务系统公钥验证签名合法性（此处要支持多个跨域端，取 authToken 的 app 名找到对应系统公钥验证签名）
					at = at.verify(prop.get("sso.defined." + at.getApp() + "_public_key"));
					if (at != null) {
						// 作为 key 设置 authToken 至分布式缓存中，然后 sso 系统二次验证
						at.setUuid(String.valueOf(System.currentTimeMillis()));
						//at.setData(data);  设置自定义信息，当然你也可以直接 at.setData(token.jsonToken()); 把当前 SSOToken 传过去
						// 设置绑定用户ID
						at.setUid(token.getUid());
						// 设置登录时间
						at.setTime(token.getTime());

						//2、SSO 的私钥签名
						at.sign(prop.get("sso.defined.sso_private_key"));

						//3、生成回复密文票据
						replyData.append(at.encryptAuthToken());
					} else {
						// 非法签名, 可以重定向至无权限界面，自己处理
						replyData.append("-2");
					}
				} else {
					// 非法签名, 可以重定向至无权限界面，自己处理
					replyData.append("-2");
				}
			}
		} else {
			// 未登录
			replyData.append("-1");
		}
		try {
			replyData.append("\"})");
			AjaxHelper.outPrint(response, replyData.toString(), "UTF-8");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}